package user

import (
	"x-admin/backend/pkg/utils"

	"gorm.io/gorm"
)

// UserMigrator 用户模块迁移器
type UserMigrator struct{}

// NewUserMigrator 创建用户模块迁移器
func NewUserMigrator() *UserMigrator {
	return &UserMigrator{}
}

// GetName 返回模块名称
func (m *UserMigrator) GetName() string {
	return "user"
}

// GetModels 返回需要迁移的模型
func (m *UserMigrator) GetModels() []interface{} {
	return []interface{}{&User{}}
}

// GetDependencies 返回依赖的模块名称
func (m *UserMigrator) GetDependencies() []string {
	return []string{"role"} // 用户模块依赖角色模块
}

// Migrate 执行模块特定的迁移逻辑
func (m *UserMigrator) Migrate(db *gorm.DB) error {
	// 创建用户角色关联表
	return db.Exec(`
		CREATE TABLE IF NOT EXISTS user_roles (
			user_id BIGINT UNSIGNED NOT NULL,
			role_id BIGINT UNSIGNED NOT NULL,
			PRIMARY KEY (user_id, role_id),
			INDEX idx_user_roles_user_id (user_id),
			INDEX idx_user_roles_role_id (role_id)
		)
	`).Error
}

// Seed 执行模块数据初始化
func (m *UserMigrator) Seed(db *gorm.DB) error {
	// 检查是否已有用户数据
	var count int64
	db.Model(&User{}).Count(&count)
	if count > 0 {
		return nil // 已有数据，跳过初始化
	}

	// 创建默认管理员用户
	hashedPassword, err := utils.HashPassword("admin123")
	if err != nil {
		return err
	}
	adminUser := User{
		ID:       1,
		Username: "admin",
		Nickname: "超级管理员",
		Email:    "admin@example.com",
		Phone:    "",
		Password: hashedPassword,
		Avatar:   "https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png",
		Status:   1,
	}
	if err := db.Create(&adminUser).Error; err != nil {
		return err
	}

	// 给管理员分配超级管理员角色
	if err := db.Exec("INSERT INTO user_roles (user_id, role_id) VALUES (?, ?)", adminUser.ID, 1).Error; err != nil {
		return err
	}

	// 创建普通用户
	hashedPassword2, err := utils.HashPassword("user123")
	if err != nil {
		return err
	}
	normalUser := User{
		ID:       2,
		Username: "user",
		Nickname: "普通用户",
		Email:    "user@example.com",
		Password: hashedPassword2,
		Avatar:   "https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png",
		Status:   1,
	}
	if err := db.Create(&normalUser).Error; err != nil {
		return err
	}

	// 给普通用户分配普通用户角色
	if err := db.Exec("INSERT INTO user_roles (user_id, role_id) VALUES (?, ?)", normalUser.ID, 2).Error; err != nil {
		return err
	}

	return nil
}
